package com.atguigu.gulimall.order.interceptor;

import com.atguigu.common.constant.AuthServerConstant;
import com.atguigu.common.vo.MemberResVo;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Description :订单服务需要登录拦截器
 * @Author : mayp
 * @Date: 2020-12-27 18:59
 */
@Component
public class LoginUserInterceptor implements HandlerInterceptor {

//    使用ThreadLocal实现共享数据
    public static ThreadLocal<MemberResVo> loginUser = new ThreadLocal<>();

    /**
     * 登录之前拦截，做一个前置拦截
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 如果远程访问订单，订单要求远程调用的话也得先登录以后才能访问，但是这个是远程调用，无需登录
        // 解决：让拦截器所有请求一进来就匹配一下，如果现在请求的路径是/order/order/status/{orderSn}这个路径，就放行，其他也也一样
        String uri = request.getRequestURI();
        AntPathMatcher antPathMatcher = new AntPathMatcher();
        boolean match = antPathMatcher.match("/order/order/status/**", uri);
        boolean match1 = antPathMatcher.match("/payed/notify", uri);
        if (match || match1){
            // 直接放行
            return true;
        }
//        通过请求获取登录信息
        MemberResVo attribute = (MemberResVo) request.getSession().getAttribute(AuthServerConstant.LOGIN_SESSION_LOGIN_USER);
//        如果不为空，说明已经登录
        if (null != attribute){
//            为了让其他线程都获取到登录信息
            loginUser.set(attribute);
            return true;
        }else{
//            未登录，统一返回登录页面(重定向到登录页面)
            request.getSession().setAttribute("msg","请先登录");
            response.sendRedirect("http://auth.gulimall.com/login.html");
            return false;
        }
    }
}
